<?php
namespace app\api\v1;

use app\common\api\ApiHelper;
use app\common\logic\ApiLogic;
use app\common\logic\SysLogic;
use app\common\service\MemberService;
use app\common\service\SysService;
use PalePurple\RateLimit\RateLimit;
use think\facade\Log;

/**
 * @classInfo(text="公共方法")
 */
class Publics
{
    private $ascriptionArray = ['请选择','海口', '三亚', '三沙', '儋州', '琼海', '文昌', '万宁', '东方', '五指山', '澄迈', '定安', '屯昌', '临高',
        '白沙','昌江','乐东','陵水','保亭','琼中',];

    private $contactUsPhone = '10000';

    /**
     * @methodInfo(text="获取基础数据",explain="")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解 noCheckToken = true 为不需要检测token isApi = true 代表是API 没有进行注解的不允许访问
     * @isNoCheckToken(true)
     * @isApi(true)
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="0",type="array",text="正确返回的数据",explain="对象或者数组，可空")
     */
    public function base_data($param){
        $data['ascription'] = $this->ascriptionArray;
        $data['contactUsPhone'] = $this->contactUsPhone;
        return ApiHelper::output($data);
    }

    /**
     * @methodInfo(text="登录",explain="")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解 noCheckToken = true 为不需要检测token isApi = true 代表是API 没有进行注解的不允许访问
     * @isNoCheckToken(true)
     * @isApi(true)
     * @methodParam(name="mobile",require="1",text="手机号",explain="")
     * @methodParam(name="password",require="1",text="密码",explain="")
     * @methodParam(name="cid",require="0",text="推送标识",explain="如果不传会造成无法推送")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="1",type="array",text="正确返回的数据",explain="对象或者数组，可空")
     * @returnParam(name="token",parent="data",require="1",type="string",text="token",explain="token")
     * @returnParam(name="expired",parent="data",require="1",type="int",text="过期时间",explain="N秒后过期")
     */
    public function login($param){
        if(empty($param['mobile'])){
            exceptionBusiness('mobile 不能为空',1);
        }
        if(empty($param['password'])){
            exceptionBusiness('password 不能为空',1);
        }
        $apiLogic = new ApiLogic();
        $jieguo = $apiLogic->login($param['mobile'],$param['password'],$param['version']);
        if($jieguo['err_code'] === 0){
            $data = $jieguo['data'];
            try {
                // 绑定推送
                if (!empty($param['cid'])) {
                    $os = '';
                    if (!empty($param['os'])) {
                        $os = $param['os'];
                    }
                    $jieguo = $apiLogic->bindPush($data['token'], $param['version'], $param['cid'],$os);
                    if ($jieguo['err_code'] != 0) {
                        Log::error('绑定推送失败' . $jieguo['msg']);
                    }
                }
            } catch (\Exception $exception) {
                Log::error('绑定推送失败' . $exception);
            }
            //

            return ApiHelper::output($data);
        }
        else{
            return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
        }
    }
    /**
     * @methodInfo(text="获取短信验证码",explain="")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解 noCheckToken = true 为不需要检测token isApi = true 代表是API 没有进行注解的不允许访问
     * @isNoCheckToken(true)
     * @isApi(true)
     * @methodParam(name="mobile",require="1",text="手机号码",explain="")
     * @methodParam(name="scene",require="1",text="短信验证码场景",explain="reg=注册；forget=找回密码")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="0",type="array",text="正确返回的数据",explain="对象或者数组，可空")
     */
    public function get_vcode($param){
        if(empty($param['mobile'])){
            exceptionBusiness('mobile 不能为空',1);
        }
        if(empty($param['scene'])){
            exceptionBusiness('scene 不能为空',1);
        }
        $phone = $param['mobile'];
        $captchaType = $param['scene'];//验证码类型，用于区分多个验证码

        // 限流 防止 枚举暴露已注册用户
        // 60 秒内 允许请求 6 次
        $rateLimit = new RateLimit("api_Publics_get_vcode", 3, 60, getRateLimitAdapter());
        if (!$rateLimit->check($param['ip'])) {
            return ApiHelper::output(1,'您的操作太频繁了');
        }

        $memberService = new MemberService();
        $jieguo = $memberService->sendMemberVCode($captchaType,$phone);
        if($jieguo['err_code'] === 0){
            return ApiHelper::output(array_merge($jieguo['data'],[
                'mobile' => $phone,
                'scene' => $captchaType,
            ]));
        }
        else{
            return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
        }
    }
    /**
     * @methodInfo(text="注册",explain="")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解 noCheckToken = true 为不需要检测token isApi = true 代表是API 没有进行注解的不允许访问
     * @isNoCheckToken(true)
     * @isApi(true)
     * @methodParam(name="mobile",require="1",text="手机号码",explain="")
     * @methodParam(name="vcode",require="1",text="短信验证码",explain="")
     * @methodParam(name="pwd",require="1",text="密码",explain="")
     * @methodParam(name="pwd2",require="1",text="确认密码",explain="")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="0",type="array",text="正确返回的数据",explain="对象或者数组，可空")
     */
    public function reg($param){
        $memberService = new MemberService();
        $jieguo = $memberService->regMember($param);
        return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
    }
    /**
     * @methodInfo(text="找回密码",explain="直接修改密码的方式")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解 noCheckToken = true 为不需要检测token isApi = true 代表是API 没有进行注解的不允许访问
     * @isNoCheckToken(true)
     * @isApi(true)
     * @methodParam(name="mobile",require="1",text="手机号码",explain="")
     * @methodParam(name="vcode",require="1",text="短信验证码",explain="")
     * @methodParam(name="pwd",require="1",text="新密码",explain="")
     * @methodParam(name="pwd2",require="1",text="确认新密码",explain="")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="0",type="array",text="正确返回的数据",explain="对象或者数组，可空")
     */
    public function forget($param){
        $memberService = new MemberService();
        $jieguo = $memberService->forgetPass($param);
        return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
    }

    /**
     * @methodInfo(text="退出登录")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解
     * @isApi(true)
     * @methodHeader(name="v",require="0",text="版本",explain="",default="v1")
     * @methodParam(name="user_id",require="0",text="用户ID",explain="",sys="true",default="")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     * @returnDemo(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     */
    public function logout($param){
        if(empty($param['user_id'])){
            exceptionBusiness('user_id 不能为空',1);
        }

        $apilogic = new ApiLogic();
        $apilogic->clearTokenByUserId($param['user_id']);
        return ApiHelper::output(0);
    }

    /**
     * @methodInfo(text="获取轮播图",explain="")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解 noCheckToken = true 为不需要检测token isApi = true 代表是API 没有进行注解的不允许访问
     * @isNoCheckToken(false)
     * @isApi(true)
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="0",type="array",text="正确返回的数据",explain="对象或者数组，可空")
     */
    public function get_banner($param){
        $sysService = new SysService();
        $jieguo = $sysService->getSlidesByCategoryId();
        if($jieguo['err_code'] != 0){
            return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
        }
        else{
            return ApiHelper::output($jieguo['data']);
        }
    }
    /**
     * @methodInfo(text="我的消息列表")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解
     * @isApi(true)
     * @methodHeader(name="v",require="0",text="版本",explain="",default="v1")
     * @methodParam(name="user_id",require="0",text="用户ID",explain="",sys="true",default="")
     * @methodParam(name="p",require="1",text="页码",explain="",sys="false",default="")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     * @returnDemo(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     */
    public function get_my_message_list($param){
        if(empty($param['user_id'])){
            exceptionBusiness('user_id 不能为空',1);
        }
        if(empty($param['p'])){
            exceptionBusiness('页码 不能为空',1);
        }
        $sysService = new SysService();
        $jieguo = $sysService->getMyMessagePager($param['user_id'], $param['p']);
        if($jieguo['err_code'] != 0){
            return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
        }
        else{
            // 处理数据
            $data = $jieguo['data'];
            $fanhui = listShowFilter($data['list'],[
                'id',
                'title',
                'content',
                'is_read',
                'create_time',
            ]);
            // 处理时间
            foreach ($fanhui as $key => $datum) {
                $fanhui[$key]['create_time_short'] = date('Y-m-d',$datum['create_time']);
                $fanhui[$key]['create_time_long'] = date('Y-m-d H:i:s',$datum['create_time']);
            }
            $data['list'] = $fanhui;

            return ApiHelper::output($data);
        }
    }

    /**
     * @methodInfo(text="读取我的某条消息")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解
     * @isApi(true)
     * @methodHeader(name="v",require="0",text="版本",explain="",default="v1")
     * @methodParam(name="user_id",require="0",text="用户ID",explain="",sys="true",default="")
     * @methodParam(name="id",require="1",text="消息ID",explain="",sys="false",default="")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     * @returnDemo(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     */
    public function get_my_message($param){
        if(empty($param['user_id'])){
            exceptionBusiness('user_id 不能为空',1);
        }
        if(empty($param['id'])){
            exceptionBusiness('消息ID 不能为空',1);
        }
        $sysService = new SysService();
        $jieguo = $sysService->getMyMessageModel($param['user_id'], $param['id'],true);
        if($jieguo['err_code'] != 0){
            return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
        }
        else{
            // 处理数据
            $data = $jieguo['data'];
            $data = modelShowFilter($data,[
                'id',
                'title',
                'content',
                'is_read',
                'create_time',
            ]);
            // 处理时间
            $data['create_time_short'] = date('Y-m-d',$data['create_time']);
            $data['create_time_long'] = date('Y-m-d H:i:s',$data['create_time']);

            return ApiHelper::output($data);
        }
    }

    /**
     * @methodInfo(text="设置我的某条消息 已读")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解
     * @isApi(true)
     * @methodHeader(name="v",require="0",text="版本",explain="",default="v1")
     * @methodParam(name="user_id",require="0",text="用户ID",explain="",sys="true",default="")
     * @methodParam(name="id",require="1",text="消息ID",explain="",sys="false",default="")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     * @returnDemo(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     */
    public function read_my_message($param){
        if(empty($param['user_id'])){
            exceptionBusiness('user_id 不能为空',1);
        }
        if(empty($param['id'])){
            exceptionBusiness('消息ID 不能为空',1);
        }
        $sysService = new SysService();
        $jieguo = $sysService->readMyMessage($param['user_id'], $param['id']);
        if($jieguo['err_code'] != 0){
            return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
        }
        else{
            return ApiHelper::output($jieguo['msg']);
        }
    }

    /**
     * @methodInfo(text="删除我的某条消息")
     * @param $param
     * @return array
     * @throws \Exception
     * 下面是接口注解
     * @isApi(true)
     * @methodHeader(name="v",require="0",text="版本",explain="",default="v1")
     * @methodParam(name="user_id",require="0",text="用户ID",explain="",sys="true",default="")
     * @methodParam(name="id",require="1",text="消息ID",explain="",sys="false",default="")
     * 下面是返回
     * @returnParam(name="code",require="1",type="int",text="错误代码",explain="0 为正确，其他错误请看错误代码表")
     * @returnParam(name="message",require="1",type="string",text="错误消息",explain="SUCCESS 为正确，其他错误请看错误代码表")
     * @returnParam(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     * @returnDemo(name="data",require="1",type="array",text="正确返回的数据",explain="空")
     */
    public function del_my_message($param){
        if(empty($param['user_id'])){
            exceptionBusiness('user_id 不能为空',1);
        }
        if(empty($param['id'])){
            exceptionBusiness('消息ID 不能为空',1);
        }
        $sysService = new SysService();
        $jieguo = $sysService->delMyMessage($param['user_id'], $param['id']);
        if($jieguo['err_code'] != 0){
            return ApiHelper::output($jieguo['err_code'],$jieguo['msg']);
        }
        else{
            return ApiHelper::output($jieguo['msg']);
        }
    }
}
